/*
 * Dian.com Inc.
 * Copyright (c) 2004-2018 All Rights Reserved.
 */
package com.miya.erpmofa.common.lang.request.single;

import com.miya.erpmofa.common.lang.constant.Constants;
import com.miya.erpmofa.common.lang.sign.MiyaSignConstants;
import com.miya.erpmofa.common.lang.sign.MiyaSignature;
import lombok.Data;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * 请求入参基类
 *
 * @author ${guanzhong}
 * @version $Id: BaseRequest.java, v 0.1 2018年07月19日 1:59 PM ${guanzhong} Exp $
 */
@Data
public abstract class BaseRequest implements Serializable {

    private static final long serialVersionUID = -2945932987651113821L;
    /**
     *  分配给开发者的应用ID
     * <b>长度 20</b>
     * <b>必填</b>
     */
    private String app_id;
    /**
     * 商户ID--对应商户，商户在米雅商家中心申请
     * <b>长度 8</b>
     * <b>必填</b>
     */
    private String merchant_id;

    /**
     * 门店ID-对应商户门店<>例如商超,百货，便利店等</>，商户在米雅商家中心填写，譬如华润的杭州西湖区振华路门店号为 00000001
     * <b>最大长度 32</b>
     * <b>必填</b>
     */
    private String store_id;

    /**
     * 设备号  譬如 POS的ID
     * <b>最大长度 32</b>
     * <b>必填</b>
     */
    private String device_no = Constants.DEVICE_NO;

    /**
     * 开发者请求参数的签名串，详见开放平台签名文档
     * <b>最大长度 344</b>
     * <b>必填</b>
     */
    private String sign;

    /**
     * 发送请求的时间，格式"yyyy-MM-dd HH:mm:ss"  例如 2014-07-24 03:07:50
     * <b>长度 19</b>
     * <b>必填</b>
     */
    private String timestamp;

    /**
     * 仅支持JSON
     * <b>最大长度 40</b>
     * <b>不需要填</b>
     */
    private String format = Constants.FORMAT;

    /**
     * 请求使用的编码格式，仅支持utf-8
     * <b>最大长度 10</b>
     * <b>不需要填</b>
     */
    private String charset = Constants.CHARSET;

    /**
     * 商户生成签名字符串所使用的签名算法类型，仅支持RSA2
     * <b>最大长度 10</b>
     * <b>不需要填</b>
     */
    private String sign_type = MiyaSignConstants.SIGN_TYPE_RSA2;

    /**
     * 调用的接口版本，默认为：1.0
     * <b>非必须</b>
     */
    private String version = Constants.VERSION;

    /**
     * 缺省的币种代码，为CNY（人民币）。
     * <b>最大长度 20</b>
     * <b>非必须</b>
     */
    private static final String currency_code = Constants.CNY;

    /**
     * 外部业务流水号---米雅生成，传递给ERP；譬如订单回写的时候可以填写订单号--即交易号
     *
     * <b>非必填</b>
     * <b>按需填写，需要控制幂等的服务为必填，如订单回写</b>
     */
    private String out_biz_no;

    /**
     * 附加信息
     *
     * <b>选填</b>
     * <b>业务传入的附加信息</b>
     */
    private Map<String, String> properties;

    /**
     * ToString方法
     */
    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
    }
    public String initSignContent(){
        Map<String,String> baseMap = new HashMap<>();
        if(StringUtils.isNotBlank(app_id)){
            baseMap.put("app_id", app_id);
        }
        if(StringUtils.isNotBlank(merchant_id)){
            baseMap.put("merchant_id", merchant_id);
        }
        if(StringUtils.isNotBlank(store_id)){
            baseMap.put("store_id", store_id);
        }
        if(StringUtils.isNotBlank(device_no)){
            baseMap.put("device_no", device_no);
        }
        if(StringUtils.isNotBlank(version)){
            baseMap.put("version", version);
        }
        if(StringUtils.isNotBlank(timestamp)){
            baseMap.put("timestamp", timestamp);
        }
        appendMap(baseMap);
       return MiyaSignature.getSignContent(baseMap);
    }
    public abstract void appendMap(Map<String,String> baseMap);
}